//
//  NetworkHandle.m
//  Test
//
//  Created by TravelRound on 16/3/22.
//  Copyright © 2016年 TravelRound. All rights reserved.
//

#import "NetworkHandle.h"
#import "Reachability.h"
#import "AFNetworking.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NetworkHandle

+ (void)GetDataWithURL:(NSString *)urlStr dic:(NSDictionary *)dic success:(void (^)(id responseObject))response filed:(void (^)(NSError *error))err
{
    // 只支持xcode7.0以上版本＋AFNetworking3.0以上版本使用
    // 如果是Xcode7.0以下版本+AFNewroking2.x版本 继续使用AFHttpRequestOperationManager
    
    NSString *newStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    
    Reachability *reach = [Reachability reachabilityForInternetConnection];
    if (0 != reach.currentReachabilityStatus) { // 判断网络状态（不等于0代表有网）
        
        AFHTTPSessionManager *man = [AFHTTPSessionManager manager];
        
        // 有的返回的数据类型，AFN不支持解析，我们需要设置一下，让AFN支持解析
        [man.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", @"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css", @"text/plain", @"application/x-javascript", @"application/javascript",nil]];
        
        [man GET:newStr parameters:dic success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            // 返回数据给调用方 response(是个block）responseObject(返回的数据类型id类型)
            response(responseObject);
            
            // 调用获取缓存路径方法，把网址和网络请求成功的值传进去
            [self cachePath:urlStr response:responseObject type:0];
            
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            err(error);
            
        }];
        
    }
    
    else { // 无网 走缓存
        
        // 拿到缓存路径
        // response 后面参数，因为我们没走网络请求，我不是要缓存数据，而是要获取数据
        
        id data = [self cachePath:urlStr response:nil type:1];
        
        if (data != nil) {// （写个保护)
            
            response(data);
        }
        
    }
    
    
}

+ (id)cachePath:(NSString *)urlStr response:(id)responseObject type:(NSInteger)type
{

    // 如果self 后面调用的是－号方法，那么这个self就是本类的对象。例如：Person *per = nil, self就是这个per。
    // 如果self 后面调用的是＋号方法, 那么这个self就是本类的名字 Person 就是self
    
    // 1. 把我们的网址利用MD5加密算法转换成数字和字符串的组合（因为网址不能直接作为文件名）
    NSString *fileName = [self cachedFileNameForKey:urlStr];
    
    // 2. 找到cache文件夹在沙盒中的路径
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
    
    // 3. 路径文件名拼接
    NSString *cacheP = [cachePath stringByAppendingPathComponent:fileName];
    
    // 4. 把网络请求成功的数据（归档）
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject];
    
    if (0 == type) { // 如果type是0 则代表我要写入 1 读取
        // 5. 写入本地
        [data writeToFile:cacheP atomically:YES];
        
        return nil;
    }
    else if (1 == type) {
        // 读取
        id data = [NSKeyedUnarchiver unarchiveObjectWithFile:cacheP];
        
        return data;
    }
    
    
    NSLog(@"%@", cacheP);
    
    return nil;
    
}

// 利用MD5算法把网址转换成一串数字加字母
+ (NSString *)cachedFileNameForKey:(NSString *)key {
    const char *str = [key UTF8String];
    if (str == NULL) {
        str = "";
    }
    unsigned char r[CC_MD5_DIGEST_LENGTH];
    CC_MD5(str, (CC_LONG)strlen(str), r);
    NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                          r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14], r[15]];
    return filename;
}


@end
